﻿namespace RulesEngine
{
    public abstract class CompositeRule<TCandidate> : IRule<TCandidate>
    {
        public abstract bool Execute(TCandidate candidate);

        public IRule<TCandidate> And(IRule<TCandidate> other)
        {
            return new AndRule<TCandidate>(this, other);
        }

        public IRule<TCandidate> Or(IRule<TCandidate> other)
        {
            return new OrRule<TCandidate>(this, other);
        }

        public IRule<TCandidate> Not()
        {
            return new NotRule<TCandidate>(this);
        }
    }
}